/*
 * TacticaDiego.java
 *
 * Created on 21 de abril de 2007, 16:05
 *
 * To change this template, choose Tools | Template Manager
 * and open the template in the editor.
 */

package futbol.tacticas.concursantes2007.CARONTE;

import futbol.General;
//import futbol.Partido;
import futbol.tacticas.*;
import futbol.tacticas.concursantes.Tactica;

import java.awt.Color;
import java.awt.Point;

import java.util.LinkedList;
import java.util.Vector;

/**
 *
 * @author Diego Gonzlez
 */
public class TacticaDiego  implements Tactica
{
    /** Jugadores */
    private static int[][] nJugadores = 
    {
        { -150, 0, 5 },     // Portera
        { -90, -30, 6 },    // Defensa
        { -90, 30, 6 },     // Defensa
        { -70, -95, 5 },    // Defensa
        { -70, 95, 5 },     // Defensa
        { 0, -50, 4 },      // Medio
        { 0, 50, 4 },       // Medio
        { 70, -95, 7 },     // Delantera
        { 70, 95, 7 },      // Delantera
        { 100, -30, 6 },    // Delantera
        { 100, 30, 6 }      // Delantera
    };
    
    /** Parmetros almacenados */
    private static int PARAMETRO_FUERZA = 2;
    private static int PARAMETRO_X = 0;
    private static int PARAMETRO_Y = 1;

    /** Creates a new instance of TacticaDiego */
    public TacticaDiego()
    {
    }
    
    /** Color de la camiseta */
    public Color getColor1() { return new Color( 80, 158, 170); }
    
    /** Color del pantaln */
    public Color getColor2() { return new Color( 80, 158, 170); }
    
    /** Color del nmero */
    public Color getColorNumero() { return Color.WHITE; }
    
    /** Nombre del equipo */
    public String getNombre() { return "CARONTE"; }

    /** Posicin altura inicial */
    public int getXInicial( int nJugador ) { return nJugadores[ nJugador ][ PARAMETRO_X ]; }

    /** Posicin lateral inicial */
    public int getYInicial( int nJugador ) { return nJugadores[ nJugador ][ PARAMETRO_Y ]; }

    /** Fuerza */
    public int getFuerza( int nJugador ) { return nJugadores[ nJugador ][ PARAMETRO_FUERZA ]; }
    
    /** Devolver los comandos que usarn los jugadores */
    public Vector<Comando> getComandos( SituacionJugadores situacionJugadores )
    {
        Vector<Comando> comandos = new Vector();
        
        // Variables auxiliares
        int nContrario, nJugador, nCompaero;
        int nFactorX, nFactorY;
        double nDistanciaContrario, nDistanciaCompaero;
        
        // Posiciones
        Point bola = situacionJugadores.getBola();
        Point[] pContrarios = situacionJugadores.getContrario();
        Point[] pJugadores = situacionJugadores.getMisJugadores();
        
        // Mantener posiciones
        for ( nJugador = 0; nJugador < 11; nJugador++ )
            comandos.add( new ComandoIrA( nJugador, getXInicial( nJugador ), getYInicial( nJugador ) ) );
        
        // Portero
        nJugador = 0;
        comandos.add( new ComandoIrA( nJugador, getXInicial( nJugador ), General.control( ( int ) bola.getY(), -30, 30 ) ) );
        comandos.add( new ComandoPase( nJugador, 10 ) );
        
        // Posiciones
        for ( nJugador = 1; nJugador < 11; nJugador++ )
        {
            if ( General.getDistancia( bola.getX(), bola.getY(), getXInicial( nJugador ), getYInicial( nJugador ) ) < 50 )
            {
                comandos.add( new ComandoIrA( nJugador, bola.getX(), bola.getY() ) );
            }
            else
            {
                nContrario = situacionJugadores.getContrarioMasCerca( getXInicial( nJugador ), getYInicial( nJugador ) );
                nFactorX = bola.getX() > pContrarios[ nContrario ].getX() ? 15 : -15;
                nFactorY = bola.getY() > pContrarios[ nContrario ].getY() ? 15 : -15;
                comandos.add( new ComandoIrA( nJugador, pContrarios[ nContrario ].getX() + nFactorX, pContrarios[ nContrario ].getY() + nFactorY ) );
            }
        }
        
        // Jugador ms cercano a la bola
        comandos.add( new ComandoIrA( situacionJugadores.getMasCercanoDeBola(), bola.getX(), bola.getY() ) );
        
        int nJugadorSiguiente = 0;
        for ( nJugador = 0; nJugador < 8; nJugador++ )
        {
            nJugadorSiguiente = nJugador;
            do
            {
                nJugadorSiguiente = situacionJugadores.getSiguienteJugador( nJugadorSiguiente );
            }
            while ( ( nJugadorSiguiente > 0 ) && ( General.getDistancia( pJugadores[ nJugador ].getX(), pJugadores[ nJugador ].getY(), pJugadores[ nJugadorSiguiente ].getX(), pJugadores[ nJugadorSiguiente ].getY() ) < 100 ) );

            if ( nJugadorSiguiente < 1 )
                nJugadorSiguiente = 10;
            
            if ( nJugadorSiguiente > 0 )
                comandos.add( new ComandoGolpearBola( nJugador, pJugadores[ nJugadorSiguiente ].getX(), pJugadores[ nJugadorSiguiente ].getY() ) );
        }
        
        for ( nJugador = 8; nJugador < 11; nJugador++ )
        {
            if ( bola.getX() >= -10 )
                comandos.add( new ComandoTiroAPuerta( nJugador, 0 ) );
            else
            {
                nJugadorSiguiente = situacionJugadores.getSiguienteJugador( nJugador );
                if ( nJugadorSiguiente > 0 )
                    comandos.add( new ComandoPase( nJugador, nJugadorSiguiente ) );
            }
        }
        
        return comandos;
     }
}
